Поддержка Unicode в Эрланг Я тут продолжаю упарываться Pie и UTF-8. В редакторе соотвественно нужно, что бы было: 1) отображение текста -- это просто достаточно взять последний slang СДЕЛАНО 2) навигация по тексту -- нужно подсчитывать количество байт в символе, слове и строке СДЕЛАНО 3) редактирование текст -- где и как правильно разрезать бинарь в двоичном дереве редактирования ОЖИДАЕТСЯ Ну а что если текст сложный, например такой: п͏͔̠̖̟̞̦р̬̺̟̰̹ͥ̃о҉ͅс̫͍͊т̀̍̃ͦ̐ͅи̱̭̩̩̖͙̫͊ ͓̙ͩ̔̑̃ͮͣ͂͠j͉͕ ͬ̑͌ͫaͧͮ̉̌ͫ̓̓va а͉͋̎̈́͢͝ͅӒ͇̝̾ͤ̓ͦа̠͙̱̟̲͆͊̋͗͋а̢̰̘̼̍ͧ̎͑͘ͅ..." Помню во времена, когда еще не было xmerl_ucs, ходило такое приложение https://github.com/synrc/ucs я его выложил для исторических нужнд, оно не актуальное сейчас. Мы его использовали в своем SyncML сервере. Самая главная функция, кооторая читает UTF-8 там такая, если тут есть крутые, можете сделать для нее коде ревью: from_utf8(<<0:1,A:7,Rest/binary>>, Acc, Tail) -> from_utf8(Rest,[A|Acc],Tail); from_utf8(<<>>,Acc,Tail) -> lists:reverse(Acc,Tail); from_utf8(<<6:3,A:5,2:2,B:6,Rest/binary>>,Acc,Tail) when A >= 2 -> from_utf8(Rest,[A*64+B|Acc],Tail); from_utf8(<<14:4,A:4,2:2,B:6,2:2,C:6,Rest/binary>>,Acc,Tail) when A > 0; B >= 32 -> Ch = (A*64+B)*64+C, if Ch < 16#D800; Ch > 16#DFFF, Ch < 16#FFFE -> from_utf8(Rest, [Ch|Acc], Tail) end; from_utf8(<<30:5,A:3,2:2,B:6,2:2,C:6,2:2,D:6,Rest/binary>>, Acc, Tail) when A > 0; B >= 16 -> from_utf8(Rest, [((A*64+B)*64+C)*64+D|Acc],Tail); from_utf8(<<62:6,A:2,2:2,B:6,2:2,C:6,2:2,D:6,2:2,E:6,Rest/binary>>, Acc, Tail) when A > 0; B >= 8 -> from_utf8(Rest,[(((A*64+B)*64+C)*64+D)*64+E|Acc], Tail); from_utf8(<<126:7,A:1,2:2,B:6,2:2,C:6,2:2,D:6,2:2,E:6,2:2,F:6, Rest/binary>>, Acc, Tail) when A > 0; B >= 4 -> from_utf8(Rest,[((((A*64+B)*64+C)*64+D)*64+E)*64+F|Acc], Tail); from_utf8(Bin,Acc,Tail) -> error_logger:info_msg("ucs Error:~n Bin=~p~n Acc=~p~n Tail=~p~n",[Bin,Acc,Tail]), {error,not_utf8}. Проверить, что она работает, очень просто: 1> A = <<"п͏͔̠̖̟̞̦р̬̺̟̰̹ͥ̃о҉ͅс̫͍͊т̀̍̃ͦ̐ͅи̱̭̩̩̖͙̫͊ ͓̙ͩ̔̑̃ͮͣ͂͠j͉͕" "ͬ̑͌ͫaͧͮ̉̌ͫ̓̓va а͉͋̎̈́͢͝ͅӒ͇̝̾ͤ̓ͦа̠͙̱̟̲͆͊̋͗͋а̢̰̘̼̍ͧ̎͑͘ͅ..."/utf8>>. <<208,191,205,143,205,148,204,160,204,150,204,159,204,158, 204,166,209,128,205,165,204,131,204,172,204,186,204,159, 204,...>> 2> rp(A). <<208,191,205,143,205,148,204,160,204,150,204,159,204,158, 204,166,209,128,205,165,204,131,204,172,204,186,204,159, 204,176,204,185,208,190,210,137,205,133,209,129,205,138, 204,171,205,141,209,130,204,128,204,141,204,131,205,166, 204,144,205,133,208,184,205,138,204,177,204,173,204,169, 204,169,204,150,205,153,204,171,32,205,169,204,148,204, 145,204,131,205,174,205,163,205,130,205,160,205,147,204, 153,106,205,172,204,145,205,140,205,171,205,137,205,149, 97,205,167,205,174,204,137,204,140,205,171,204,147,204, 147,118,97,32,208,176,205,139,204,142,205,132,205,157, 205,162,205,137,205,133,208,144,204,136,204,190,205,164, 204,147,205,166,205,135,204,157,208,176,205,134,205,138, 204,139,205,151,205,139,204,160,205,153,204,177,204,159, 204,178,204,179,205,135,204,169,204,178,208,176,204,141, 205,167,204,142,205,145,204,162,205,152,204,176,204,152, 204,188,205,133,46,46,46>> ok 3> xmerl_ucs:from_utf8(binary_to_list(A)) == ucs:from_utf8(binary_to_list(A)). true 4> ux_string:length(xmerl_ucs:from_utf8(binary_to_list(A))). 19 Вообщем как видите в эрланге все просто с Unicode, даже если вам нужно заглянуть в поток и поработать с кодепойнтами для того что бы правильно спозиционировать курсор в своем редакторе или для манипуляций с буфером. Я уже сделал простенькую навигацию по UTF-8 тексту и его отображение в терминале. На очереди полноценное редктирование сложных кодепойтнов. https://imgprx.livejournal.net/b74660d57c202457a15ab589b5cab1e4fd124204/wJBWvdzv 88iUS9SsZsd70W5YHJO1nUCvee6LbQY5Go-mph8TfUhQjPqmB9MwH-cOlF_3MzlFUht9Ku2D841FzQ Кстати Pie открывает 120МБ текстовый файл за 1 сек (как и Emacs), mcedit за 0.5 сек. Но в отличие от mcedit и emacs, Pie позиционируется на конец файла моментально. Кстати в Pie есть автокомплишин при поиске по файлам, ман страницы открывает полноценный CUA моде и уже многое другое. Команды для Pie выглядят еще проще чем на лиспе, вот например команда открытия ман страницы: {"M-m", {edit_lib, man_page, []}}, man_page(State) -> Word = symbol_at_point(State), Command = "man " ++ Word, Text = os:cmd(Command), R = edit_util:popup_message(State, list_to_atom(Command), Text), start_of_buffer(next_window(R)). только надо избавится от этих атомов в заголовках окон.